# 列表（只接受位置索引）
pre_table= ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne']
print(pre_table[0])
print(pre_table[-2])
print(pre_table[0:3])
print(pre_table[-10:-7])
print(pre_table[-10:])
print(pre_table[:9])

# 字典(key-value,key不能重复，value可以；key是不能被修改的，是不可改变的；value可以被修改，被改变，可以是任意对象
code = {
    'AA': 'BaiDu',
    'BB': 'Google',
    'CC': 'TaoBao',
    'CC': 'TaoBao'
}
print(code)
print(code['AA'])
code['DD'] = 'JD'
print(code)
del code['DD']
print(code)

# 元组（稳固版的列表，不可被修改，所以列表中存在的方法不能使用在元组上，但元组可以被查看索引的
letters = ('a', 'b', 'c', 'd')
print(letters[0])

# 集合（集合中的元素是无需的，不重复的任意对象，可以使用集合来判断数据的从属关系，还可以把数据结构中重复的元素减掉
a_set = {1, 2, 3, 4}
a_set.add(5)
print(a_set)
a_set.discard(5)
print(a_set)

# 数据结构的一些使用技巧
# 1、多重循环
num_list = [6, 2, 7, 5, 9, 8, 3]
print(sorted(num_list)) # 按照长短、大小、英文字母的顺序给每个列表中的元素进行排序
print(sorted(num_list, reverse=True)) # 倒序整理
str = ['aaa', 'wda', 'aaa', 'ss', 15, ['aaa', 152, 10]]
for a, b in zip(num_list, str):
    print(b, 'is', a)

# 2、推导式（列表解析法）
import time
t0 = time.clock()
# 将10个元素写入列表，普通做法
a = []
for i in range(1, 2000000):
    a.append(i)
print(time.clock() - t0, 'seconds process time')
# 列表解析法(更好理解，而且效率更快)
t0 = time.clock()
b = [i for i in range(1, 2000000)]
print(time.clock() - t0, 'seconds process time')

a = [i**2 for i in range(1, 10)] # 1到9的平方
c = [j+1 for j in range(1, 10)]
k = [n for n in range(1, 10) if n % 2 ==0] # 1到9的偶数
z = [letter.lower() for letter in 'ABCDEFGHLM']
print(a)
print(c)
print(k)
print(z)

# 字典的推导式
d = {i: i+1 for i in range(1, 4)}
print(d)
g = {i: j for i, j in zip(range(1, 6), 'abcde')}
print(g)
g = {i: j.upper() for i, j in zip(range(1, 6), 'abcde')}
print(g)

# 循环列表时获取元素的索引
letters =['a', 'b', 'c', 'd', 'e']
for num, letter in enumerate(letters):
    print(letter, 'is', num + 1)


